package models

import (
	"time"

	"gorm.io/gorm"
)

// CircleType 圈子类型枚举
type CircleType string

const (
	CircleTypeGlobal  CircleType = "global"  // 全球圈
	CircleTypeCountry CircleType = "country" // 国家圈
	CircleTypeCity    CircleType = "city"    // 城市圈
)

// PostStatus 帖子状态枚举
type PostStatus string

const (
	PostStatusDraft     PostStatus = "draft"     // 草稿
	PostStatusPublished PostStatus = "published" // 已发布
	PostStatusHidden    PostStatus = "hidden"    // 隐藏
	PostStatusDeleted   PostStatus = "deleted"   // 已删除
)

// VisibilityLevel 可见性级别枚举
type VisibilityLevel string

const (
	VisibilityPublic    VisibilityLevel = "public"    // 公开
	VisibilityFriends   VisibilityLevel = "friends"   // 仅好友
	VisibilityFollowers VisibilityLevel = "followers" // 仅关注者
	VisibilityPrivate   VisibilityLevel = "private"   // 私密
)

// Circle 圈子模型
type Circle struct {
	ID          uint           `json:"id" gorm:"primaryKey"`
	Name        string         `json:"name" gorm:"not null;size:100"`     // 圈子名称
	Type        CircleType     `json:"type" gorm:"not null;index"`        // 圈子类型
	CountryCode string         `json:"country_code" gorm:"size:10;index"` // 国家代码
	CityCode    string         `json:"city_code" gorm:"size:20;index"`    // 城市代码
	Description string         `json:"description" gorm:"size:500"`       // 圈子描述
	CoverImage  string         `json:"cover_image" gorm:"size:500"`       // 封面图片
	MemberCount int            `json:"member_count" gorm:"default:0"`     // 成员数量
	PostCount   int            `json:"post_count" gorm:"default:0"`       // 帖子数量
	IsActive    bool           `json:"is_active" gorm:"default:true"`     // 是否激活
	CreatedAt   time.Time      `json:"created_at"`
	UpdatedAt   time.Time      `json:"updated_at"`
	DeletedAt   gorm.DeletedAt `json:"-" gorm:"index"`
}

// Tag 标签模型
type Tag struct {
	ID          uint           `json:"id" gorm:"primaryKey"`
	Name        string         `json:"name" gorm:"not null;uniqueIndex;size:50"`  // 标签名称
	CircleID    uint           `json:"circle_id" gorm:"not null;index;default:1"` // 添加圈子ID字段，默认为全球圈
	Color       string         `json:"color" gorm:"size:20;default:'#007bff'"`    // 标签颜色
	Description string         `json:"description" gorm:"size:200"`               // 标签描述
	PostCount   int            `json:"post_count" gorm:"default:0"`               // 使用该标签的帖子数量
	IsActive    bool           `json:"is_active" gorm:"default:true"`             // 是否激活
	CreatedAt   time.Time      `json:"created_at"`
	UpdatedAt   time.Time      `json:"updated_at"`
	DeletedAt   gorm.DeletedAt `json:"-" gorm:"index"`
}

// Post 帖子模型
type Post struct {
	ID           uint            `json:"id" gorm:"primaryKey"`
	UserID       string          `json:"user_id" gorm:"not null;index;size:50"` // 发布者ID
	User         *User           `json:"user,omitempty" gorm:"foreignKey:UserID;references:UserID"`
	CircleID     uint            `json:"circle_id" gorm:"not null;index"` // 圈子ID
	Circle       *Circle         `json:"circle,omitempty" gorm:"foreignKey:CircleID"`
	Title        string          `json:"title" gorm:"not null;size:200"`                    // 帖子标题
	Content      string          `json:"content" gorm:"type:text"`                          // 帖子内容
	Images       string          `json:"images" gorm:"type:text"`                           // 图片URLs，JSON格式
	Videos       string          `json:"videos" gorm:"type:text"`                           // 视频URLs，JSON格式
	Status       PostStatus      `json:"status" gorm:"not null;default:'draft';index"`      // 帖子状态
	Visibility   VisibilityLevel `json:"visibility" gorm:"not null;default:'public';index"` // 可见性级别
	ViewCount    int             `json:"view_count" gorm:"default:0"`                       // 浏览次数
	LikeCount    int             `json:"like_count" gorm:"default:0"`                       // 点赞数
	CommentCount int             `json:"comment_count" gorm:"default:0"`                    // 评论数
	ShareCount   int             `json:"share_count" gorm:"default:0"`                      // 分享数
	IsTop        bool            `json:"is_top" gorm:"default:false;index"`                 // 是否置顶
	IsHot        bool            `json:"is_hot" gorm:"default:false;index"`                 // 是否热门
	PublishedAt  *time.Time      `json:"published_at" gorm:"index"`                         // 发布时间
	CreatedAt    time.Time       `json:"created_at"`
	UpdatedAt    time.Time       `json:"updated_at"`
	DeletedAt    gorm.DeletedAt  `json:"-" gorm:"index"`

	// 关联关系
	Tags     []Tag     `json:"tags,omitempty" gorm:"many2many:post_tags;"`
	Comments []Comment `json:"comments,omitempty" gorm:"foreignKey:PostID"`
	Likes    []Like    `json:"likes,omitempty" gorm:"foreignKey:PostID"`

	// 位置字段
	LocationLatitude  float64 `json:"location_latitude" gorm:""`
	LocationLongitude float64 `json:"location_longitude" gorm:""`
	LocationAddress   string  `json:"location_address" gorm:"size:500"`
}

type PostTag struct {
	ID        uint           `json:"id" gorm:"primaryKey"`
	PostID    uint           `json:"post_id" gorm:"not null;index:idx_post_tag_unique,unique"`
	TagID     uint           `json:"tag_id" gorm:"not null;index:idx_post_tag_unique,unique"`
	CreatedAt time.Time      `json:"created_at"`
	DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
}

// Comment 评论模型
type Comment struct {
	ID         uint           `json:"id" gorm:"primaryKey"`
	PostID     uint           `json:"post_id" gorm:"not null;index"`         // 帖子ID
	UserID     string         `json:"user_id" gorm:"not null;index;size:50"` // 评论者ID
	User       *User          `json:"user,omitempty" gorm:"foreignKey:UserID;references:UserID"`
	ParentID   *uint          `json:"parent_id" gorm:"index"`            // 父评论ID（回复功能）
	Content    string         `json:"content" gorm:"not null;type:text"` // 评论内容
	LikeCount  int            `json:"like_count" gorm:"default:0"`       // 点赞数
	ReplyCount int            `json:"reply_count" gorm:"default:0"`      // 回复数
	IsTop      bool           `json:"is_top" gorm:"default:false"`       // 是否置顶
	CreatedAt  time.Time      `json:"created_at"`
	UpdatedAt  time.Time      `json:"updated_at"`
	DeletedAt  gorm.DeletedAt `json:"-" gorm:"index"`

	// 关联关系
	Replies []Comment `json:"replies,omitempty" gorm:"foreignKey:ParentID"`
}

// Like 点赞模型
type Like struct {
	ID        uint           `json:"id" gorm:"primaryKey"`
	UserID    string         `json:"user_id" gorm:"not null;index;size:50"` // 点赞者ID
	PostID    *uint          `json:"post_id" gorm:"index"`                  // 帖子ID（可选）
	CommentID *uint          `json:"comment_id" gorm:"index"`               // 评论ID（可选）
	CreatedAt time.Time      `json:"created_at"`
	DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
}

// Follow 关注关系模型
type Follow struct {
	ID          uint           `json:"id" gorm:"primaryKey"`
	FollowerID  string         `json:"follower_id" gorm:"not null;index;size:50"`  // 关注者ID
	FollowingID string         `json:"following_id" gorm:"not null;index;size:50"` // 被关注者ID
	CreatedAt   time.Time      `json:"created_at"`
	DeletedAt   gorm.DeletedAt `json:"-" gorm:"index"`
}

// TableName 指定表名
func (User) TableName() string {
	return "users"
}

func (Circle) TableName() string {
	return "circles"
}

func (Tag) TableName() string {
	return "tags"
}

func (Post) TableName() string {
	return "posts"
}

func (PostTag) TableName() string {
	return "post_tags"
}

func (Comment) TableName() string {
	return "comments"
}

func (Like) TableName() string {
	return "likes"
}

func (Follow) TableName() string {
	return "follows"
}
